【CS61B】Lec25 Minimum Spanning Trees

  • 973 字
  1. 1. Lec25 Minimum Spanning Trees
    1. 1.0.1. 方法1:DFS
    2. 1.0.2. 方法2:加权并查集
  2. 1.1. 最小生成树
    1. 1.1.1. 定义
    2. 1.1.2. 割
  3. 1.2. 生成最小生成树
    1. 1.2.1. 朴素算法
    2. 1.2.2. Prim
    3. 1.2.3. Kruskal

Lec25 Minimum Spanning Trees

## 判断一个无向图是否存在环

方法1:DFS

  • 持续搜索知道发现被标记的顶点
  • 注意不要回头看刚来过的地方,防止提前结束

最坏时间复杂度

方法2:加权并查集

  • 对每一条边v-w,检查连通性
    • 若不连通,则合并v与w
    • 若连通,说明存在环

最坏时间复杂度

最小生成树

定义

给予一个无向图G,生成树T是G的一个子图,其中T:

  • 是连通的
  • 是无环的
  • 包括所有顶点
生成树

其中最小生成树是包含最小权值和的生成树

割

  • 割指的是将节点分配到两个非空集合
  • 横切边指的是跨越割的两个集合的两个顶点间连成的边
  • 切分定理:给定任意的割,横切边中权值最小的边一定属于最小生成树(假设边的权值互不相同)

生成最小生成树

朴素算法

即按照割的性质,给所有顶点随机涂色,并找到最小权重的边

  • 寻找生成树中没有横切边的一个割
  • 将最小权重的横切边加入最小生成树
  • 重复直到V-1条边

可以实现,但是效率很差

Prim

从任意一个节点开始,均初始化为无穷

  • 添加已在最小生成树里的存在节点的边中的最短边
  • 重复直到V-1条边

这中间,用到了类似于dijkstra的松弛,不同之处在于每次试图添加每条边时,Prim算法按照到目前构建的最小生成树的距离的大小访问节点

代码如下:

code1 code2

时间复杂度:

image-20250929201047333

Kruskal

该算法考虑按照每条边的权重顺序添加边到最小生成树中

  • 将每条边按照权重递增顺序考虑
  • 每次添加最短边进入最小生成树,除非会产生环
  • 重复直到v-1条边

这里也使用了割的性质:我们将已经加入最小生成树的顶点设为同一颜色,未加入的设为另一颜色,寻找最小权重的横切边加入最小生成树,同时能够组成环的两个顶点一定是在同一颜色的集合中

代码如下:

code

时间复杂度:

时间复杂度
赞助喵
非常感谢您的喜欢!
赞助喵